Apache Tomcat Servlet/JSP 容器

Apache Tomcat 5.5 Servlet/JSP 容器

Jaxmao Logo

链接

用户手册

参考

Apache Tomcat 开发

Apache Tomcat 5.5 Servlet/JSP 容器

默认 Servlet 参考手册

Printer Friendly Version
print-friendly
version
简介
这里讨论不同的操纵默认servlet的方法。讨论的话题有:
什么是DefaultServlet
默认的servlet是既服务于静态资源又服务于目录列表(如果允许目录列表的话)的servlet。
它在什么地方被声明的?
它在$CATALINA_HOME/conf/web.xml中被全局声明。默认形式的声明是这样的: $CATALINA_HOME/conf/web.xml
<servlet> 
<servlet-name>default</servlet-name> 
<servlet-class> 
org.apache.catalina.servlets.DefaultServlet 
</servlet-class> 
<init-param> 
<param-name>debug</param-name> 
<param-value>0</param-value> 
</init-param> 
<init-param> 
<param-name>listings</param-name> 
<param-value>true</param-value> 
</init-param> 
<load-on-startup>1</load-on-startup> 
</servlet> 

... 

<servlet-mapping> 
<servlet-name>default</servlet-name> 
<url-pattern>/</url-pattern> 
</servlet-mapping>
因此在默认的情况下,默认servlet在webapp启动时被装载,目录列表可被使用,日志调试功能被关掉。 (翻译者备注:在Tomcat 5.5.13之后的版本,已经将listings默认设置为false,默认是禁止目录列表了 参见 http://issues.apache.org/bugzilla/show_bug.cgi?id=37150)
我能做什么样的改变?
DefaultServlet允许以下初始化参数:
debug 日志级别。如果你不是tomcat开发人员,这对你没有什么用处。目前,有用的值是0, 1, 11, 1000。
listings 如果没有欢迎文件,要不要显示目录列表?值可以是truefalse
欢迎文件是servlet api的一部分。
警告:列表显示包含太多记录的目录是非常消耗服务性能的 . 大量请求访问大目录列表会吃掉服务器大部分的资源.
readmeFile 如果允许目录列表,可能有一个readme文件和这个列表在一起。这个文件包含HTML被插入。默认值是null。
globalXsltFile 如果你希望定制你的目录列表显示效果,你可以使用一个XSL转换(transformation)。这个值是一个可用于所有目录列表的绝对路径文件名。它可以被每个webapp 重新自定义使用,或者通过在你局部webapp的web.xml文件里声明默认servlet取消使用。这个xml文件的格式在下面有显示。
localXsltFile 你还可以在每个目录通过配置localXsltFile定制你的目录列表。它应该是在产生列表的目录里的一个相对路径文件名。它覆盖globalXsltFile。如果这个值存在,但是文件不存在,那么就使用globalXsltFile。如果globalXsltFile也不存在,那么默认的目录列表就会被显示出来。
input 在读取用于服务的资源时的输入缓冲容量(in bytes)。[2048]
output 在读取用于服务的资源时的输出缓冲容量(in bytes)。[2048]
readonly 这个上下文否"read only",因此如PUT 和 DELETE的HTTP命令将被拒绝执行? [true]
fileEncoding 文件编码用于读取静态资源时. [平台默认值]
sendfileSize 如果连接器支持 sendfile, 这个参数表示sendfile将用到的最小文件大小(以KB为单位) . 使用负数 可以禁止使用sendfile. [48]
我怎样定制目录列表?

你可以用你自己的实现(implementation)来覆盖DefaultServlet,并在你的web.xml声明里使用它。如果你能理解刚刚所讲的,我们假设你可以阅读DefaultServlet servlet的代码,并能做适当的调整(如果不行,这个方法对你不适用)。

你可以使用localXsltFileglobalXsltFile,DefaultServlet将会产生一个xml文件,并通过一个基于localXsltFile和globalXsltFile所提供的xsl转换来执行。首先检查localXsltFile,然后是globalXsltFile,再后是默认行为。

格式

<listing> 
<entries> 
<entry type='file|dir' urlPath='aPath' size='###' date='gmt date'> 
fileName1 
</entry> 
<entry type='file|dir' urlPath='aPath' size='###' date='gmt date'> 
fileName2 
</entry> 
... 
</entries> 
<readme></readme> 
</listing>
  • 如果 type='dir' ,size将不存在
  • Readme是一个CDATA输入

下面的是一个xsl文件示例,它模拟默认的tomcat行为:
<?xml version="1.0"?> 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0"> 

<xsl:output method="xhtml" encoding="iso-8859-1" indent="no"/> 

<xsl:template match="listing"> 
<html> 
<head> 
<title> 
Sample Directory Listing For 
<xsl:value-of select="@directory"/> 
</title> 
<style> 
h1{color : white;background-color : #0086b2;} 
h3{color : white;background-color : #0086b2;} 
body{font-family : sans-serif,Arial,Tahoma; 
color : black;background-color : white;} 
b{color : white;background-color : #0086b2;} 
a{color : black;} HR{color : #0086b2;} 
</style> 
</head> 
<body> 
<h1>Sample Directory Listing For 
<xsl:value-of select="@directory"/> 
</h1> 
<hr size="1" /> 
<table cellspacing="0" 
width="100%" 
cellpadding="5" 
align="center"> 
<tr> 
<th align="left">Filename</th> 
<th align="center">Size</th> 
<th align="right">Last Modified</th> 
</tr> 
<xsl:apply-templates select="entries"/> 
</table> 
<xsl:apply-templates select="readme"/> 
<hr size="1" /> 
<h3>Apache Tomcat/5.0</h3> 
</body> 
</html> 
</xsl:template> 


<xsl:template match="entries"> 
<xsl:apply-templates select="entry"/> 
</xsl:template> 

<xsl:template match="readme"> 
<hr size="1" /> 
<pre><xsl:apply-templates/></pre> 
</xsl:template> 

<xsl:template match="entry"> 
<tr> 
<td align="left"> 
<xsl:variable name="urlPath" select="@urlPath"/> 
<a href="{$urlPath}"> 
<tt><xsl:apply-templates/></tt> 
</a> 
</td> 
<td align="right"> 
<tt><xsl:value-of select="@size"/></tt> 
</td> 
<td align="right"> 
<tt><xsl:value-of select="@date"/></tt> 
</td> 
</tr> 
</xsl:template> 

</xsl:stylesheet>
我怎样保护目录列表的安全性?
在每一个webapp里使用web.xml 。参看Servlet 规范中关于安全的相关章节。

Copyright © 1999-2006, Apache Software Foundation